package dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import model.Cidade;
import model.Departamento;
import model.Empresa;
import model.Estado;
import model.Funcao;
import model.Funcionario;
import model.FuncionarioTipo;


public class FuncionarioDao {

	Connection conexao;
	
	public FuncionarioDao(Connection conexao){
		this.conexao = conexao;
	}

	public ArrayList<Funcionario> listarFuncionarios(Empresa empresa){
		
		ArrayList<Funcionario> listaFuncionarios  = new ArrayList<Funcionario>();
		Funcionario funcionario;
	
		StringBuilder select = new StringBuilder();
		select.append("SELECT FUNCIO.ID_FUNCIONARIO, FUNCIO.NM_FUNCIONARIO AS NM_FUNCIONARIO,");
				select.append("FUNCIO.NU_TELEFONE AS NU_TELEFONE,");
				select.append("FUNCIO.NU_RAMAL AS NU_RAMAL,");
				select.append("FUNCIO.AD_EMAIL AS AD_EMAIL,");
				select.append("FUNCIO.NU_CELULAR AS NU_CELULAR,");
				select.append("EMP.NM_EMPRESA AS NM_EMPRESA,");
				select.append("DEPART.NM_DEPARTAMENTO AS NM_DEPARTAMENTO,");
				select.append("FUNCAO.NM_FUNCAO AS NM_FUNCAO,");
				select.append("FUNTIPO.NM_TIPO AS NM_NIVEL_HIERARQUICO,");
				select.append("FUNCIOSUP.NM_FUNCIONARIO AS NM_SUPERVISOR,");
				select.append("FUNCIOSUP.NU_TELEFONE AS SUPERVISOR_TELEFONE,");
				select.append("FUNCIOSUP.NU_RAMAL AS SUPERVISOR_RAMAL,");
				select.append("FUNCIOSUP.AD_EMAIL AS SUPERVISOR_EMAIL,");
				select.append("FUNCIOSUP.NU_CELULAR AS SUPERVISOR_CELULAR,");
				select.append("CID.NM_CIDADE AS NM_CIDADE,");
				select.append("EST.NM_ESTADO AS NM_ESTADO ");
		select.append("FROM FUNCIONARIOS FUNCIO ");
			select.append("INNER JOIN EMPRESAS EMP ");
				select.append("ON FUNCIO.FK_ID_EMPRESA = EMP.ID_EMPRESAS ");
			select.append("INNER JOIN DEPARTAMENTOS DEPART ");
				select.append("ON FUNCIO.FK_ID_DEPARTAMENTO = DEPART.ID_DEPARTAMENTO ");
			select.append("INNER JOIN FUNCOES FUNCAO ");
				select.append("ON FUNCIO.FK_ID_FUNCAO = FUNCAO.ID_FUNCAO ");
			select.append("INNER JOIN FUNCIONARIO_TIPO FUNTIPO ");
				select.append("ON FUNCIO.FK_ID_TIPO_FUNCIONARIO = FUNTIPO.ID_TIPO_FUNCIONARIO ");
			select.append("INNER JOIN FUNCIONARIOS FUNCIOSUP ");
				select.append("ON FUNCIO.FK_ID_FUNCIONARIO_SUPERIOR = FUNCIOSUP.ID_FUNCIONARIO ");
			select.append("INNER JOIN CIDADES CID ");
				select.append("ON EMP.FK_ID_CIDADE = CID.ID_CIDADE ");
			select.append("INNER JOIN ESTADOS EST ");
				select.append("ON EMP.FK_ID_ESTADO = EST.ID_ESTADO ");
		select.append("WHERE FUNCIO.FK_ID_EMPRESA = ?");
		
		try {
			PreparedStatement prepStmt = conexao.prepareStatement(select.toString());
			prepStmt.setLong(1, empresa.getIdEmpresa());
			ResultSet rs = prepStmt.executeQuery();
			while(rs.next()){
				
				funcionario = new Funcionario();
				
				funcionario.setIdFuncionario(rs.getLong("FUNCIO.ID_FUNCIONARIO"));
				funcionario.setNmFuncionario(rs.getString("NM_FUNCIONARIO"));
				funcionario.setNuTelefone(rs.getString("NU_TELEFONE"));
				funcionario.setNuRamal(rs.getString("NU_RAMAL"));
				funcionario.setAdEmail(rs.getString("AD_EMAIL"));
				funcionario.setNuCelular(rs.getString("NU_CELULAR"));
				empresa.setNmEmpresa(rs.getString("NM_EMPRESA"));
				funcionario.setEmpresa(empresa);
				Departamento dep = new Departamento();
				dep.setNmDepartamento(rs.getString("NM_DEPARTAMENTO"));
				Funcao funcao = new Funcao(); funcao.setNmFuncao(rs.getString("NM_FUNCAO"));
				FuncionarioTipo funTipo = new FuncionarioTipo(); funTipo.setNmTipo(rs.getString("NM_NIVEL_HIERARQUICO"));
				funcionario.setSuperiorImediato(rs.getString("NM_SUPERVISOR"));
				
				Cidade cidade = new Cidade(); cidade.setNmCidade(rs.getString("NM_CIDADE"));
				Estado estado = new Estado(); estado.setNmEstado(rs.getString("NM_ESTADO"));
				
				funcionario.setCidade(cidade);
				funcionario.setEstado(estado);
				
				listaFuncionarios.add(funcionario);
			
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}

		return listaFuncionarios;
	}

	
	
	
	/**
	 * Metodo listarFuncionarioSuperiores()
	 * 
	 * 
	 * @return {@link JSONArray}
	 * 
	 * @author Moises Santana
	 * 
	 * @since DEZ-03-2012
	 * 
	 * */
	/*
	public JSONArray listarFuncionariosSuperiores(Empresa empresa){
		JSONArray arrayFuncionarioSuperiores = new JSONArray();
		StringBuilder select = new StringBuilder();
		select.append("SELECT ID_FUNCIONARIO, NM_FUNCIONARIO FROM FUNCIONARIOS ");
			select.append("WHERE (FK_ID_TIPO_FUNCIONARIO = 1 ");
				select.append("OR FK_ID_TIPO_FUNCIONARIO = 4 ");
				select.append("OR FK_ID_TIPO_FUNCIONARIO = 3) AND FK_ID_EMPRESA = ? ORDER BY NM_FUNCIONARIO");
		try {
			PreparedStatement prepStmt = conexao.prepareStatement(select.toString());
			prepStmt.setLong(1, empresa.getIdEmpresa());
			ResultSet rs = prepStmt.executeQuery();
			while(rs.next()){
				arrayFuncionarioSuperiores.put(new JSONObject()
					.put("id_funcionario_superior", rs.getString("ID_FUNCIONARIO"))
					.put("nm_funcionario_superior", rs.getString("NM_FUNCIONARIO"))
				); 

			}
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (JSONException e) {
			e.printStackTrace();
		}
		return arrayFuncionarioSuperiores;
	}
	*/
	
}
